//
//  HomeTableViewController.swift
//  vveboSwiftPro
//
//  Created by 杨笑怡 on 15/6/28.
//  Copyright © 2015年 YangXiaoYi. All rights reserved.
//

import UIKit
import SVProgressHUD

class HomeTableViewController: BaseTableViewController {
    
    /// 表格绑定的微博数据数组
    var statusesList: [Status]? {
        didSet {
            // 刷新表格
            tableView.reloadData()
            
            // 关闭刷新控件
            refreshControl?.endRefreshing()
        }
    }
    
    // 定义行高缓存 [statusID：行高]
    lazy var rowHeightCache = [Int: CGFloat]()

    override func viewDidLoad() {
        super.viewDidLoad()

        visitorView?.setupViewInfo("visitordiscover_feed_image_house", message: "关注一些人，回这里看看有什么惊喜", isHome: true)
        
        // 如果用户没有登录，直接返回
        if !userLogin {
            return
        }
        
        // 以下代码都是用户登陆后才需要执行的
        setupNavigationBar()
        prepareTableView()
        
        loadData()
        
        refreshControl = XLRefreshControl()
        
        // 添加监听方法
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
        // 清空行高缓存，提示： NSCache 不能清空
        rowHeightCache.removeAll()
    }
    
    ///  加载微博数据
    func loadData() {
        
        // 下拉刷新的代号，取得数组中第一条数据的 id
        let since_id = statusesList?.first?.id ?? 0
        
        Status.loadStatus(since_id) { (statuses, error) -> () in
            if error != nil {
                // 不要把错误的详细信息告诉用户，程序猿应该多测试
                SVProgressHUD.showInfoWithStatus("您的网络不给力")
                return
            }
            // 提示，下拉刷新，没有新微博的情况，不要报错
            if statuses == nil {
                print("没有数据")
                return
            }
            
            // 跟踪转发微博
            print("retweet \(statuses?.count) weibos")
            
            // 判断是否是下拉刷新，将新的微博，添加到原有数组的前面
            if since_id > 0 {
                self.statusesList = statuses! + self.statusesList!
            } else {
                self.statusesList = statuses
            }
        }
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        
        // 开启动画
        visitorView?.startAnimation()
        
    }
    
    // MARK: - 表格的数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statusesList?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 1. 取得 数据模型
        let status = statusesList![indexPath.row]
        
        // 2. 取 标识符
        let ID = StatusCell.cellIdentifier(status)
        
        // 此方法必须注册可重用cell，如果不注册会崩溃
        let cell = tableView.dequeueReusableCellWithIdentifier(ID, forIndexPath: indexPath) as! StatusCell
        
        // 设置cell
        cell.status = status
        
        return cell 
    }
    
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // 1. 取到对象
        let status = statusesList![indexPath.row]
        
        // 1.1 判断是否缓存了行高，如果有直接返回
        if rowHeightCache[status.id] != nil {
            return rowHeightCache[status.id]!
        }
        
        // 2. 获取 cell - 从可重用的 缓冲池 中提取一个cell，说明之前用过，要计算行高准确，需要实例化一个cell
        // Xcode 7.0 新发现的
        // 2.1 取可重用的 ID
        let ID = StatusCell.cellIdentifier(status)
        // 2.2 定义一个类，默认是原创微博的 cell
        var cls: AnyClass = StatusNormalCell.self
        // 2.3 根据 ID 判断是否是转发微博
        if ID == XLStatusForwardCellIdentifier {
            cls = StatusForwardCell.self
        }
        // 2.4 根据cls 创建 cell
        let cell = cls.new() as! StatusCell
        
        // 3. 返回行高
        let height = cell.rowHeight(status)
        rowHeightCache[status.id] = height
        return height
    }
    
    /// 转场动画代理
    let popoverAnimator = PopoverAnimator()
    
    func showFriendGroup() {
        let sb = UIStoryboard(name: "FriendGroup", bundle: nil)
        let vc = sb.instantiateViewControllerWithIdentifier("FriendGroupSB")
        
        // 1. 设置“转场”代理
        vc.transitioningDelegate = popoverAnimator
        // 2. 设置视图的展现大小
        let x = (view.bounds.width - 200) * 0.5
        popoverAnimator.presentFrame = CGRectMake(x, 56, 200, 300)
        // 3. 设置“转场”模式  - 自定义转场动画
        vc.modalPresentationStyle = UIModalPresentationStyle.Custom
        
        presentViewController(vc, animated: true, completion: nil)
        
    }
    
    
    ///  显示 QRCode页面
    func showQRCode() {
        let sb = UIStoryboard(name: "QRCode", bundle: nil)
        presentViewController(sb.instantiateInitialViewController()!, animated: true, completion: nil)
    }
    
    // MARK: - 设置UI
    ///  设置导航条
    private func setupNavigationBar() {
        // 判断用户是否登录
        if sharedUserAccount == nil {
            return
        }
        
        // 1. 设置按钮 - 调用 UIBarButtonItem_Extension 扩展方法创建
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch",hightlightedImageName:nil)
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop",hightlightedImageName:nil)
        
         let rightBtn = navigationItem.rightBarButtonItem!.customView as! UIButton
        rightBtn.addTarget(self, action: "showQRCode", forControlEvents: UIControlEvents.TouchUpInside)
        
        // 2. 设置标题
        let titleBtn = HomeTitleButton.button(sharedUserAccount!.name!)
        
        titleBtn.addTarget(self, action: "showFriendGroup", forControlEvents: UIControlEvents.TouchUpInside)
        
        navigationItem.titleView = titleBtn
        
    }
    
    private func prepareTableView() {
        
        // 注册可重用 cell
        tableView.registerClass(StatusForwardCell.self, forCellReuseIdentifier: XLStatusForwardCellIdentifier)
        tableView.registerClass(StatusNormalCell.self, forCellReuseIdentifier: XLStatusNormalCellIdentifier)
        
        // 取消分隔线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
    }
}
